home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / dev / asm / Asm_Course2.lha / Teil27.TXT < prev    next >
Text File  |  1992-09-02  |  12KB  |  321 lines

  1.           A S S E M B L E R - K U R S       (c)  Jeff Kandle 1990
  2.  
  3.                                 27.Teil...
  4.  
  5. Hat mal wieder etwas laenger gedauert, aber ich habe im moment sehr viel zu
  6. tun. Unter anderem muss ich mich um ein Netzteil fuer meine Festplatte
  7. kuemmern die ich mir gekauft habe. Das wird auch noch etwas dauern, und
  8. sobald ich alles fuer die Platte habe muss ich sie mir ja auch noch
  9. einrichten und mich damit bekannt machen. Also wenn die Teile jetzt
  10. Zeitlich ein bisschen mehr auseinander liegen, dann denkt nicht ich haette
  11. euch vergessen, es ist einfach nur die Platte.
  12.  
  13. Aber weiter gehts...
  14.  
  15. Das einfache setzen eines Bobs duerfte jetzt ja kein Problem mehr sein,
  16. oder ?
  17. Geben wir uns mal an eine Routine die aus einem Wort die X und Y
  18. Koordinaten errechnet und die Werte fuer den Blitter setzt.
  19. Allerdings treten da ein paar wichtige sachen auf die man beachten muss.
  20. Aber fangen wir mal Theoretisch an. Um das Programm einfach zu halten
  21. arbeiten wir nur mit PAL-Koordinaten. Das heisst das wir zwar einen
  22. Overscan Screen haben, aber nur Koordinaten von 0 bis 255 erlauben.
  23.  
  24. Ich gehe diese Theoretischen durchlauf einer solchen Routine mit einem
  25. Beispielwert durch. Das erleichtert die sache.
  26.  
  27. Der Beispielwert ist $5167, also Y = $51 und X = $67.
  28. Die Werte fuer den Bildschirm sind.
  29. Bitplanes bei $60000,$6002c,$60058 (Verschachtelt)
  30. Bytes pro Zeile = 44($2c)
  31.  
  32. Rechnen wir erstmal den Y-Wert aus...
  33.  
  34. Dazu muessen wir erstmal den anderen Krempel loswerden der noch in dem
  35. Kontrollwort steht. Das machen wir indem wir es durch $100 Dividieren. Dann
  36. steht nur noch die $0051 da.
  37. Also Zeile $51....Da muessten wir normalerweise zum Anfang der Plane nur
  38. $51 * $2c Addieren. Da wir aber drei verschachtelte Planes haben, muss man
  39. den ganzen Krempel noch mal drei nehmen. Damit wir uns eine Multiplikation
  40. zu ersparen nehmen wir die Zeilenzahl direkt mal $84 (3 * $2c).
  41. Bei Zeile $51 muesste dann $51 * $84 + $60000 gerechnet werden.
  42.  
  43. Da kommt nach Adam`s Riesen $629c4 bei raus. Das ist also der Zeilenanfang
  44. an dem der Bobs steht.
  45.  
  46. Gehen wir jetzt weiter zur Komplizierteren Routine. Holen wir uns erneut
  47. das Kontrollwort. Mit der Logischen Funktion AND koennen wir den Oberen
  48. Teil ausmaskieren. Bleibt noch die $67, die die X Koordinate in Pixeln
  49. angibt. Da wir aber immer nur 15 Pixel verschieben koennen muessen wir
  50. erstmal mit Hardscrolling so nah wie moeglich an den Punkt rankommen an dem
  51. der Bob dann hinterher steht. Also brauchen wir erstmal die 6. Teilen wir
  52. den Krempel durch $10. Jetzt steht die $6 im Wort. Da wir nicht Byteweise
  53. sondern Wortweise arbeiten, muessen wir die 6 noch verdoppeln. Dazu
  54. multiplizieren wir es nicht, sondern Addieren das Register zu sich selbst
  55. dazu. Denn die Multiplikation des MC 68000 sind eine sehr langsame sache.
  56. Nachdem wir es verdoppelt haben, koennen wir es zu der Adresse der Zeile
  57. dazuaddieren. Dann stehen wir schon sehr nah am Ziel.
  58.  
  59. Jetzt muessen wir noch den Wert fuer das Softscrollen errechnen..
  60. Dazu maskieren wir alles ausser den Softwert mit AND aus. Nehmen den * $100
  61. um ihn in das Highbyte des hinteren Wortes zu kriegen, und Addieren dazu
  62. einfach den Rest des BLTCON0 Registers dazu.
  63.  
  64. Diese Routine macht das eben besprochene. Am Ende der Routine steht in A0
  65. die Adresse an der der Bob dargestellt wird, und in D0 das Komplette Word
  66. fuer das BLTCON0 Register.
  67.  
  68.  
  69. ; Beim Aufruf der Routine muss das Kontrollwort schon feststehen und
  70. ; in D7 stehen.
  71.  
  72. CoordCalc:
  73.  
  74.         Move.l  d7,d1                   ; Kontrollwort nach D1
  75.         And.l   #$ff00,d1               ; Alles ausser Y-Werte aus-
  76.                                         ; maskieren !
  77.         Divs    #$100,d1                ; Nach unten schieben
  78.         Muls    #$84,d1                 ; Wert auf dem Screen ermitteln
  79.         Add.l   #$60000,d1              ; Plus PlayfieldBase
  80.         Move.l  d1,a0                   ; Nach A0 setzen.
  81.  
  82.         Move.l  d7,d1                   ; Erneut holen !
  83.         And.l   #$00f0,d1               ; Unwichtiges ausmaskieren
  84.         Lsr.l   #3,d1                   ; Ersetzt Divs $10 und verdoppeln
  85.         Add.l   d1,a0
  86.  
  87.         Move.l  d7,d1                   ; !!!
  88.         And.l   #$f,d1                  ; Ausmaskieren !
  89.         Swap    d1
  90.         Lsr.l   #4,d1
  91.         Move.w  #%0000100111110000,d0   ; BLTCON0-Wert ohne Scrollwert
  92.                                         ; nach d0
  93.         Add.w   d1,d0                   ; D1 zu D0 addiert ergibt BLTCON0
  94.         Clr.l   d1                      ; Werte nur in D0 und A0 lassen
  95.         Clr.l   d7
  96.  
  97.         Bsr.l   Set_bob                 ; Bob setzen.
  98.         Rts
  99.  
  100. So diese koennt ihr direkt hinter die Set_Bob-Routine setzen. Da diese
  101. Routine vor der Set_bob aufgerufen werden muss, muesst ihr in dem oberen
  102. Teil des Listings aus dem Bsr.l Set_Bob ein Bsr.l Coordcalc machen.
  103. Davor setzt ihr zum Probieren die Zeile
  104.  
  105.         Move.l  #$5167,d7
  106.  
  107. Damit es schonmal laeuft.
  108. Dann muesst ihr noch die Set_Bob Routine aendern, das nicht mehr die festen
  109. Werte geschrieben werden, sondern D0 nach BLTCON0 und A0 nach BLTDPT
  110. geschrieben wird, das muesstet ihr finden.
  111. Als letztes koennt ihr noch in der Clearschleife aus der -1 eine 0 machen,
  112. damit der Screen Schwarz wird und man die Raender links und rechts von Bob
  113. sehen, obwohl es ja auch ganz Interressant ist sie zu sehen.
  114.  
  115. Um diesen Bob auf dem Screen rumflitzen zu lassen, muessen wir eigentlich
  116. nur noch eine Routine schreiben die der Coordcalc-Routine laufend neue
  117. Koordinaten uebergibt. Das sollte dann jeden Bildschirm aufbau passieren.
  118. Also muessen wir die abfrage der Bildschirmposition einbauen, die Tabelle
  119. mit den Positionen und die Routine die die Koordinaten uebergibt und die
  120. Tabelle rotiert.
  121. Allerdings fehlt dann noch etwas...Naemlich eine Routine die den alten Bob
  122. loescht damit die Reste nicht auf dem Bildschirm bleiben. Das ist zwar ein
  123. netter Effekt, aber auch nicht unbedingt das was wir wollen.
  124.  
  125. So hier erstmal das Prograemmchen. Ich habe keine Koordinatentabelle
  126. benutzt weil sie Platz wegnimmt, und ich ausserdem keine lust habe mir die
  127. Finger an so einer Tabelle wund zu schreiben. Das Position des Bobs wird
  128. durch einen ADD befehl veraendert.
  129.  
  130. Start:
  131. Execbase=       4
  132. Openlibrary=    -408
  133. Vposr=          $dff004
  134. Forbid=         -30-102
  135. Permit=         -30-108
  136. Bltafwm=        $dff044
  137. Bltalwm=        $dff046
  138. Bltcon0=        $dff040
  139. Bltcon1=        $dff042
  140. Bltamod=        $dff064
  141. Bltdmod=        $dff066
  142. Bltapt=         $dff050
  143. Bltdpt=         $dff054
  144. Dmacon=         $dff096
  145. Intena=         $dff09a
  146. Dmaconr=        $dff002
  147. Bltsize=        $dff058
  148. Cop1lc=         $dff080
  149.  
  150.         Move.w  #$0020,Dmacon
  151.         Move.w  #$4000,Intena
  152.         Move.l  Execbase.w,a6
  153.         Jsr     Forbid(a6)
  154.  
  155.  
  156.         Move.l  #$60000,a0
  157.         Move.l  #$9588/4,d0
  158. Clearloop:
  159.         Move.l  #0,(a0)+
  160.         Dbf     d0,Clearloop
  161.  
  162.         Bsr.l   Makecl
  163.  
  164.  
  165. Wait:   Move.l  Vposr,d0
  166.         And.l   #$1ff00,d0
  167.         Cmp.l   #$1000,d0
  168.         Bne.s   Wait
  169.         Bsr.l   Kill_old
  170.         Bsr.l   Get_Pos
  171.         Btst    #6,$bfe001
  172.         Bne.s   Wait
  173.  
  174.         Move.l  Execbase.w,a6
  175.         Jsr     Permit(a6)
  176.         Lea     Gfxname(pc),a1
  177.         Jsr     Openlibrary(a6)
  178.         Move.l  d0,a6
  179.         Move.w  #$83e0,Dmacon
  180.         Move.w  #$c000,Intena
  181.         Move.l  38(a6),Cop1lc
  182.         Moveq   #0,d0
  183.         Rts
  184. Makecl:
  185.         Lea     $05f000,a0
  186.         Move.l  a0,$dff080
  187.  
  188.         Move.l  #$00e00006,(a0)+
  189.         Move.l  #$00e20000,(a0)+
  190.         Move.l  #$00e40006,(a0)+
  191.         Move.l  #$00e6002c,(a0)+
  192.         Move.l  #$00e80006,(a0)+
  193.         Move.l  #$00ea0058,(a0)+
  194.         Move.l  #$008e1a64,(a0)+
  195.         Move.l  #$009039d1,(a0)+
  196.         Move.l  #$00920030,(a0)+
  197.         Move.l  #$009400d8,(a0)+
  198.         Move.l  #$01003200,(a0)+
  199.         Move.l  #$01080058,(a0)+
  200.         Move.l  #$010a0058,(a0)+
  201. ;----------------------------------------------
  202.         Move.l  #$01800000,(a0)+
  203.         Move.l  #$0182071d,(a0)+
  204.         Move.l  #$0184088e,(a0)+
  205.         Move.l  #$0186044f,(a0)+
  206.         Move.l  #$0188000f,(a0)+
  207.         Move.l  #$018a000c,(a0)+
  208.         Move.l  #$018c0008,(a0)+
  209.         Move.l  #$018e0004,(a0)+
  210. ;----------------------------------------------
  211.         Move.l  #$fffffffe,(a0)+
  212.         Rts
  213. Waitblit:
  214.         Btst    #6,Dmaconr
  215.         Bne.s   Waitblit
  216.         Rts
  217. Set_bob:
  218.         Bsr.s   Waitblit
  219.         Move.w  #$ffff,Bltafwm
  220.         Move.w  #$ffff,Bltalwm
  221.         Move.w  d0,Bltcon0
  222.         Move.w  #0,Bltamod              ; Quellmodulo = 0 (rawblit)
  223.         Move.w  #38,Bltdmod             ; Zielmodulo = 38 (planes = $2c)
  224.         Move.l  #$5e000,Bltapt          ; Quelladr.
  225.         Move.l  a0,Bltdpt               ; Zieladr.
  226.         Move.w  #96*64+3,Bltsize        ; Bltsize und Start
  227.         Rts
  228.  
  229. ; Beim Aufruf der Routine muss das Kontrollwort schon feststehen und
  230. ; in D7 stehen.
  231.  
  232. CoordCalc:
  233.  
  234.         Move.l  d7,d1                   ; Kontrollwort nach D1
  235.         And.l   #$ff00,d1               ; Alles ausser Y-Werte aus-
  236.                                         ; maskieren !
  237.         Divs    #$100,d1                ; Nach unten schieben
  238.         Muls    #$84,d1                 ; Wert auf dem Screen ermitteln
  239.         Add.l   #$60000,d1              ; Plus PlayfieldBase
  240.         Move.l  d1,a0                   ; Nach A0 setzen.
  241.  
  242.         Move.l  d7,d1                   ; Erneut holen !
  243.         And.l   #$00f0,d1               ; Unwichtiges ausmaskieren
  244.         Lsr.l   #3,d1                   ; Ersetzt Divs $10 und verdoppeln
  245.         Add.l   d1,a0
  246.  
  247.         Move.l  d7,d1                   ; !!!
  248.         And.l   #$f,d1                  ; Ausmaskieren !
  249.         Swap    d1
  250.         Lsr.l   #4,d1
  251.         Move.w  #%0000100111110000,d0   ; BLTCON0-Wert ohne Scrollwert
  252.                                         ; nach d0
  253.         Add.w   d1,d0                   ; D1 zu D0 addiert ergibt BLTCON0
  254.         Clr.l   d1                      ; Werte nur in D0 und A0 lassen
  255.         Clr.l   d7
  256.  
  257.         Bsr.l   Set_bob                 ; Bob setzen.
  258.         Move.l  a0,Old_Pos              ; Position fuer loeschroutine
  259.                                         ; merken !
  260.         Rts
  261.  
  262. Kill_Old:
  263.         Bsr.l   Waitblit
  264.         Move.l  #$-1,Bltalwm
  265.         Move.w  #38,Bltdmod
  266.         Move.w  #%0000000100000000,Bltcon0
  267.         Move.l  Old_Pos,Bltdpt
  268.         Move.w  #96*64+3,Bltsize
  269.         Rts
  270.  
  271. Get_Pos:
  272.         Move.w  Position,d7
  273.         Add.w   #$101,Position
  274.         Bsr.l   Coordcalc
  275.         Rts
  276.  
  277. Old_Pos:        Dc.l $60000
  278. Position:       Dc.w 0
  279. Gfxname:        dc.b "graphics.library",0
  280.  
  281. >Extern         "bob.raw",$5e000
  282.  
  283. Wichtig ist allerdings eines.
  284. Da ich die Kill_Old Routine vor der Get_Pos Routine aufrufe, und sie die
  285. Koordinaten erst beim Ersten Aufruf von Get_Pos kriegt muesst ihr das
  286. reservierte Langwort Old_pos mit irgendeiner Adresse fuellen.
  287. Ich hatte naemlich nur geschrieben
  288.  
  289. Old_pos:        Dc.l 0
  290.  
  291. Und mein Amiga stuerzte jedesmal nach dem Druck auf die Maustaste ab.
  292.  
  293. Was war passiert:
  294. Beim ersten Aufruf der Kill_Old Routine hat der Blitter als Destination
  295. fuer seine Loeschaktion die 0 als Adresse gekriegt. Und da bei 0 und $4
  296. sehr wichtige Daten liegen war das nicht so gut. Das Programm lief ohne
  297. Probs weiter. Sobald ich aber das Programm beenden wollte und auf die
  298. Maustaste drueckte stuerzte er ab. Ganz klar - er holte sich die Execbase
  299. nach A6 und sprang Openlibrary an. Da aber nicht mehr die Execbase sondern
  300. Irgendetwas in $4 stand, ging er daran zu grunde.
  301.  
  302. Solche sachen bringen mich dann immer um denn Verstand. Ich sitze dann
  303. immer wie Apathisch vor der Kiste. Schreibe nach und nach alle Routinen neu
  304. und nicht passiert.
  305. Beim Essen ist es mir dann eingefallen was das schief gelaufen ist.
  306. So kanns gehen...
  307.  
  308. Da ich wiegesagt keine Tabelle fuer die position dabei gesetzt habe,
  309. solltet ihr das mal selber versuchen. Es duerfte allerdings kein Problem
  310. fuer euch sein. Denn ihr habt das ja schon mehrmals gemacht.
  311. Ihr koennt auch mal versuchen die Routine auf mehrere Bobs um zu schreiben.
  312. Dabei werdet ihr dann auf eine Sache stossen die dem Thema Bobs einen sehr
  313. komplizierten Touch geben. Und wir werden uns damit sehr stark auseinander
  314. setzen muessen.
  315.  
  316. Naja, ich will euch nicht den Mut nehmen....
  317.  
  318. Schoenen Tag noch
  319.  
  320.                 Jeff Kandle
  321.